BSW Module Description Template
原文: AUTOSAR_CP_TPS_BSWModuleDescriptionTemplate
概述
BSW Module Template Specification 文件说明了定义 BSW 模块的 Module Description 写法(结构、章节、命名规则),明确厂商的配置工具需要将用户配置的参数通过何种方式描述出来。
BSWMDT 适用于 BSW 模块/集群和库。
库(Library)是一种特殊的模块。与 BSW 模块相同,其可以为基本软件和应用程序提供服务,而且可以通过 Function-Call 进行访问。与 BSW 模块不同的是,库可以直接从 SWC 调用,而不是必须通过 RTE。
BSWMDT 可以用于:
- 在代码实现之前根据接口和依赖指定 BSW 模块或集群
- 用作一致性检测,即检测是否符合 AUTOSAR 标准
- 可以用于描述交付生产的 BSW 模块。其包含内部行为、实现方式、约束等
- 供集成商使用以添加更多信息
- 添加来自上游的测量校准工具
- 实现 RTE(Runtime Environment)和 BSW Scheduler 代码实现的内容部分(如版本信息、内存段、数据结构)等。由 RTE 生成器完成。
这些功能会在下文中被详细阐述,并在 Software Component Template 中有详细的说明。
Three Layer Approach 三层模型
整个 BSWMDT 由三层架构实现。

BswModuleDescription
最上层包含了所有已提供和必须的接口规范,包括和其他模块的依赖关系。
BswInternalBehavior
中间层包含了模块内部基本活动的模型。其定义了模块对于 OS 和 BSW Scheduler 的要求。对于相同的 BswModuleDescription,可能会有不同的中间层实例。
BswImplementation
底层包含了关于具体代码的信息。同样,对于相同的 BswInternalBehavior,可能会有不同的底层实例。
这些层之间使用可分割聚合或引用的方式,为 XML 构建提供更大的灵活性。这就像 C 代码项目中包含头文件的方式:多个实现可以共享同一个头文件。即,通过可分割聚合或引用,各层可以被分割在不同的文件中,更低的层可以被很好的修改。
根据三层架构,三层之间的关系并非一一对应,而是有不同的实现方式。如果一个 BSW 模块的不同版本是针对不同 CPU 编译的,则其 BSWMD 可以视为独立的构建,可以共享中间层和上层。
如果是针对同一 CPU 编译的,即在同一个 ECU 中,则处于相同的地址空间(如针对多个 CAN 通道的 CAN Driver),则其 BSWMD 依然应该共享上层和中间层,但是必须有方法确保这两者派生的全局 C 符号是唯一的。一种实现方式是 BSWMDT 中的后缀。
某些 BSW 模块不仅与其他 BSW 模块具有接口,还通过 RTE 为 SWC 提供更加抽象的接口。这些模块可以是 AUTOSAR 服务、ECU 抽象的一部分,或者是复杂驱动程序。
这里提到的更加抽象的接口就是 AUTOSAR 接口。这些接口通过 SWCT (Software Component Template)描述,见:Software Component Template。SWCT的根类是 ServiceSwComponentType、EcuAbstractionSwComponentType 和 ComplexDeviceDriverSwComponentType,均从 AtomicSwComponent 类派生而来。
此外,从 RTE 向 BSW 发送的函数调用被建模为可运行实体(RunnableEntity)。这些实体也在SWCT 中被定义。
因此,对于每个可以通过 AUTOSAR 接口访问的 BSW 模块和集群,除了 BSWMD 外,应该还有一个 XML 文件用于定义 AtomicSwComponent 和 SwcInternalBehavior。
这些额外的描述是为了生成 RTE。对于 AUTOSAR 服务而言,这些额外描述的内容因 ECU 不同可能会不同,因此需要针对每个 ECU 进行创建。
由于上述的模块描述采用了 BSWDMT、SWCT 两种不同的 Template,在描述调度上存在一定模糊性。即两者皆可。需要注意的是,SWC 风格的接口仅用于通过端口通信直接相关的功能调用。
BSW Module Description 顶层 概览

该图展示了针对顶层 BswModuleDescription 的连接关系。
本节其余内容对于上图的某些变量定义做了一定约束,再次不再赘述。仅举几例:
对于定义 BswModuleDescription,仅允许以下三种值:
- BSW_MODULE
- BSW_CLUSTER
- LIBRARY 不可以为空或者其他值。
如 BswModuleEntry:

接下来用例子说明 BSWMDT 中该内容是如何落实的。
比如 SchM 周期调用 Can_MainFunction_Write 时:
void Can_MainFunction_Write(void);
CAN 模块为 BswModuleEntry 的提供者。根据 [TPS_BSWMDT_04002],其应该具有:
<BswModuleDescription>
<SHORT-NAME>Can</SHORT-NAME>
<!-- CAN 模块对外提供的接口 -->
<IMPLEMENTED-ENTRY>
<BSW-MODULE-ENTRY>
<SHORT-NAME>Can_MainFunction_Write</SHORT-NAME>
<!-- 函数签名描述 -->
<SIGNATURE>
<RETURN-TYPE/>
<ARGUMENTS/>
</SIGNATURE>
</BSW-MODULE-ENTRY>
</IMPLEMENTED-ENTRY>
</BswModuleDescription>
即提供 Can_MainFunction_Write 作为 implementedEntry - BswModuleEntry。
此时,CAN 模块通过 BSWMD 声明:实现了一个 Can_MainFunction_Write(void)。
SchM 模块作为使用者(Usage),根据 [TPS_BSWMDT_04513],应当有:
<BswModuleDescription>
<SHORT-NAME>SchM</SHORT-NAME>
<!-- SchM 需要的接口 -->
<EXPECTED-ENTRY>
<BSW-MODULE-ENTRY>
<SHORT-NAME>Can_MainFunction_Write</SHORT-NAME>
<!-- SchM 期望的函数签名 -->
<SIGNATURE>
<RETURN-TYPE/>
<ARGUMENTS/>
</SIGNATURE>
</BSW-MODULE-ENTRY>
</EXPECTED-ENTRY>
</BswModuleDescription>
即接受(使用) Can_MainFunction_Write 作为 expectedEntry - BswModuleEntry。
对于标准 [TPS_BSWMDT_04310],即当 BswModuleEntry 被引用或者 SHORT-NAME 相同时,可以认为是匹配(matching)的。其 SHORT-NAME 均为 Can_MainFunction_Write ,故匹配。

对于 [constr_4093],即签名一致性校验,可以认为是其匹配的类型约束:即当两者均为返回类型或返回类型(参数)相同或其 SwServiceArgs 返回的类型相同时,认为是匹配(matching)的。
通过该例,重新理解 Figure 3.1,可以发现其逻辑:
左侧的 BswModuleDescription,对于其属性 ModuleID,即代表了不同的 BSW 模块,如 Det、Can、NvM等。
与其余模块(如 BswModuleEntry、BswModuleDependency)等的连接关系表明引用关系。即表明模块和接口之间的调用关系。
BSW Interface 接口
该部分描述了针对单一 BSW Module 的接口形态。

上图体现了对于 BswModuleEntry 模块的接口形态设定。

该表描述了上图中的部分属性及其类型、数量。BSW 上层厂商可以根据这些信息编写配置软件以使其能够生成符合 AUTOSAR 规范的 XML 文件。如:
<?xml version="1.0" encoding="UTF-8"?>
<AUTOSAR xmlns="http://autosar.org/schema/r4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AR-PACKAGES>
<AR-PACKAGE>
<SHORT-NAME>BswModuleEntries</SHORT-NAME>
<ELEMENTS>
<!-- 定义一个 BswModuleEntry 实例,代表一个基础软件模块的 API 入口 -->
<BSW-MODULE-ENTRY UUID="Entry_001">
<SHORT-NAME>CanIf_Write</SHORT-NAME>
<!-- 对应表格中的 bswEntryKind 属性 -->
<BSW-ENTRY-KIND>CONCRETE</BSW-ENTRY-KIND>
<!-- 对应表格中的 callType 属性 -->
<CALL-TYPE>SYNCHRONOUS</CALL-TYPE>
<!-- 对应表格中的 executionContext 属性 -->
<EXECUTION-CONTEXT>INTERRUPT-1</EXECUTION-CONTEXT>
<!-- 对应表格中的 functionPrototypeEmitter 属性 -->
<FUNCTION-PROTOTYPE-EMITTER>RTE</FUNCTION-PROTOTYPE-EMITTER>
<!-- 对应表格中的 isReentrant 属性 -->
<IS-REENTRANT>true</IS-REENTRANT>
<!-- 对应表格中的 argument (ordered) 属性,定义函数的输入输出参数 -->
<ARGUMENTS>
<SW-SERVICE-ARG UUID="Arg_001">
<SHORT-NAME>CanId</SHORT-NAME>
<SW-DATA-DEF-PROPS>
<SW-DATA-DEF-PROPS-VARIANTS>
<SW-DATA-DEF-PROPS-VARIANT>
<SW-DATA-DEF-PROPS-CONDITIONAL>
<BASE-TYPE-REF DEST="SW-BASE-TYPE">/AUTOSAR_Platform/BaseTypes/uint32</BASE-TYPE-REF>
</SW-DATA-DEF-PROPS-CONDITIONAL>
</SW-DATA-DEF-PROPS-VARIANT>
</SW-DATA-DEF-PROPS-VARIANTS>
</SW-DATA-DEF-PROPS>
</SW-SERVICE-ARG>
<SW-SERVICE-ARG UUID="Arg_002">
<SHORT-NAME>CanData</SHORT-NAME>
<SW-DATA-DEF-PROPS>
<SW-DATA-DEF-PROPS-VARIANTS>
<SW-DATA-DEF-PROPS-VARIANT>
<SW-DATA-DEF-PROPS-CONDITIONAL>
<BASE-TYPE-REF DEST="SW-BASE-TYPE">/AUTOSAR_Platform/BaseTypes/uint8</BASE-TYPE-REF>
<SW-ARRAY-SIZE>8</SW-ARRAY-SIZE>
</SW-DATA-DEF-PROPS-CONDITIONAL>
</SW-DATA-DEF-PROPS-VARIANT>
</SW-DATA-DEF-PROPS-VARIANTS>
</SW-DATA-DEF-PROPS>
</SW-SERVICE-ARG>
</ARGUMENTS>
</BSW-MODULE-ENTRY>
</ELEMENTS>
</AR-PACKAGE>
</AR-PACKAGES>
</AUTOSAR>
在这段实例 XML 中,容易发现其体现了部分在表中描述的属性:
<BSW-ENTRY-KIND>→bswEntryKind<CALL-TYPE>→callType<EXECUTION-CONTEXT>→executionContext<FUNCTION-PROTOTYPE-EMITTER>→functionPrototypeEmitter<IS-REENTRANT>→isReentrant
而厂商会根据这样的接口 XML 描述,生成类似下面的 C 代码:
#include "CanIf.h"
#include "CanDrv.h" // CAN 驱动头文件
/* CanIf_Write 具体实现 */
void CanIf_Write(uint32 CanId, uint8 CanData[8])
{
/* 中断上下文保护(对应 executionContext = INTERRUPT-1) */
Irq_Lock(INTERRUPT_1);
/* 调用 CAN 驱动发送数据(同步调用,对应 callType = SYNCHRONOUS) */
CanDrv_Write(CanId, CanData, 8);
/* 释放中断保护(保证可重入) */
Irq_Unlock(INTERRUPT_1);
}
BSW Internel Behavior 中间层 概览
与顶层相同,中间层也有类似的架构图:

同样提供了某些属性:

这些属性以同样的方式被生成于 XML 中,组成中间层的描述,即包含了模块内部基本活动的描述。
BSW Implementation 底层 概览
该层描述了 BSW 软件的实现细节标准。

Three Layer Approach 举例说明
ResourceConsumption
该部分内容定义了当 AUTOSAR 软件映射到 ECU 时,SWC 及 BSW 对资源消耗和系统限制的信息。
其他模块的实现方式和链接逻辑大同小异,故在此不再赘述。
总结
BSWMDT 提供了一套关于 BSW 上游厂商生成配置文件(XML)描述的具体标准。遵守 AUTOSAR 的厂商会通过这种标准编写符合标准的软件,供下游厂商或用户调用。这就是在汽车电子领域非常流行的 Arxml 文件格式及 XDM 文件格式的编写语法的由来。